package br.com.paradigmas.persistencia.om;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import br.com.paradigmas.utils.BDConstantes;

/**
 * @author Djalma
 */
public class Album implements Serializable
{
	/*-*-*-* Constante de Serializacao *-*-*-*/
	private static final long serialVersionUID = 1L;

	/*-*-*-* Variaveis e Objetos Privados *-*-*-*/
	private long pkAlbum;
	private String nome;
	private Date dataLancamento;
	private int status = BDConstantes.STATUS_ATIVO;

	private List<AlbumMusica> albumMusicas;

	private List<AlbumArtista> albumArtistas;

	private List<AlbumGenero> albumGeneros;
	
	
	// @roteiro_04
	private List<Musica> musicas = null;
	private Artista artista;

	/*-*-*-* Construtores *-*-*-*/
	public Album() { }
	
	public Album(long pkAlbum, String nome, ArrayList<Musica> musicas)
	{
		this.pkAlbum 	= pkAlbum;
		this.nome 		= nome;
		this.musicas	= musicas;
	}

	/*-*-*-* Metodos Gets e Sets *-*-*-*/
	public long getPkAlbum()							{ return pkAlbum; }
	public void setPkAlbum(long pkAlbum) 				{ this.pkAlbum = pkAlbum; }

	public String getNome() 							{ return nome; }
	public void setNome(String nome) 					{ this.nome = nome; }

	public Date getDataLancamento() 					{ return dataLancamento; }
	public void setDataLancamento(Date dataLancamento) 	{ this.dataLancamento = dataLancamento; }

	public int getStatus() 								{ return status; }
	public void setStatus(int status) 					{ this.status = status; }

	public List<AlbumMusica> getAlbumMusicas() 						{ if(albumMusicas==null) { albumMusicas = new ArrayList<AlbumMusica>(); } return albumMusicas; }
	public void setAlbumMusicas(List<AlbumMusica> albumMusicas) 	{ this.albumMusicas = albumMusicas; }

	public List<AlbumArtista> getAlbumArtistas() 					{ if(albumArtistas==null) { albumArtistas = new ArrayList<AlbumArtista>(); } return albumArtistas; }
	public void setAlbumArtistas(List<AlbumArtista> albumArtistas) 	{ this.albumArtistas = albumArtistas; }

	public List<AlbumGenero> getAlbumGeneros() 						{ if(albumGeneros==null) { albumGeneros = new ArrayList<AlbumGenero>(); } return albumGeneros; }
	public void setAlbumGeneros(List<AlbumGenero> albumGeneros) 	{ this.albumGeneros = albumGeneros; }

	public Artista getArtista() 						{ return artista; }
	public void setArtista(Artista artista) 			{ this.artista = artista; }
	
	public List<Musica> getMusicas()				{ return musicas; }
	public void setMusicas(List<Musica> musicas)	{ this.musicas = musicas; }
	
	
	/*-*-*-* Metodos @roteiro_04 *-*-*-*/
	/**
	 * Adiciona uma musica ao Album
	 * 
	 * @author Djalma
	 * @param musica
	 */
	public void adicionarMusica(Musica musica)
	{
		this.musicas.add(musica);
	}
	
	/**
	 * Localiza uma musica a partir do nome da musica
	 * 
	 * @author Djalma
	 * @param nomeMusica
	 * @return musica || null (caso haja erro)
	 */
	public Musica localizarMusica(String nomeMusica)
	{
		try
		{
			for (Musica musica : musicas)
			{
				if(musica.getNome().equals(nomeMusica))
				{ return musica; }
			}
		}
		catch (Exception e)
		{ e.printStackTrace(); }
		
		return null;
	}
	
	/**
	 * Localiza uma musica a partir do codigo da musica
	 * 
	 * @author Djalma
	 * @param codigoMusica
	 * @return musica || null (caso haja erro)
	 */
	public Musica localizarMusica(int codigoMusica)
	{
		try
		{
			for (Musica musica : musicas)
			{
				if(musica.getPkMusica() == codigoMusica)
				{ return musica; }
			}
		}
		catch (Exception e)
		{ e.printStackTrace(); }
		
		return null;
	}
	
	/**
	 * Recupera quantas musicas existem no album
	 * 
	 * @author Djalma
	 * @param album
	 * @return quantidadeMusicas || null (caso haja erro)
	 */
	public Integer contarMusicas(Album album)
	{
		try
		{
			return this.musicas.size();
		}
		catch (Exception e)
		{ e.printStackTrace(); }
		
		return null;
	}
	
	/**
	 * Recupera o tempo de execucao da soma das musicas do album
	 * 
	 * @author Djalma
	 * @return tempoExecucao || null (em caso de erro)
	 */
	public Long obterTempoDeExecucao()
	{
		try
		{
			if(musicas != null)
			{
				long tempoExecucao = 0;
				
				for (Musica musica : musicas)
				{ tempoExecucao += musica.getDuracao(); }
				
				return tempoExecucao;
			}
		}
		catch (Exception e)
		{ e.printStackTrace(); }
		
		return null;
	}
}